<?php

/*** 2.4 处理一系列整数 ****/

// 问题

// 希望对一个整数范围应用一段代码

// 解决方案 使用for 循环

$start = 3;

$end = 10;
$step = 2;
for ($i = $start; $i <= $end; $i += $step) {
    //printf(" %d squared is %d\n", $i, $i * $i);
}

//  3 squared is 9
// 5 squared is 25
// 7 squared is 49
// 9 squared is 81

/****** 使用 range() 然后一个数组  *********************************
 * 其中 $start 到 $end 的值，好处间接性，坏处大数组可能会不必要占用过多内存
 * 第三个参数是 可以跳步，
 * $start 也可以 大于 $end 这是合法的 按降序返回
 *
 * range() 生成的字符只是 ASCII 字节，所以对多字符 Unicode 字符不使用
 ***/

$numbers = range(1, 10, 2);
//array(5) {
//  [0]=>
//  int(1)
//  [1]=>
//  int(3)
//  [2]=>
//  int(5)
//  [3]=>
//  int(7)
//  [4]=>
//  int(9)
//}

$numbers = range(10, 1, 3);
//array(4) {
//  [0]=>
//  int(10)
//  [1]=>
//  int(7)
//  [2]=>
//  int(4)
//  [3]=>
//  int(1)
//}

$numbers = (range('l', 'p'));
//Array
//(
//    [0] => l
//    [1] => m
//    [2] => n
//    [3] => o
//    [4] => p
//)


function squares($start, $stop)
{
    if ($start < $stop) {
        for ($i = $start; $i < $stop; $i++) {
            yield $i => $i * $i;
        }
    } else {
        for ($i = $stop; $i > $start; $i--) {
            yield $i => $i * $i;
        }
    }
}

// yield 生成器

foreach (squares(3, 7) as $n => $square) {
    printf("%d squared is %d\n", $n, $square);
}